package com.g1.gzbooksingle.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.g1.gzbooksingle.mapper.DgIndexMenuMapper;
import com.g1.gzbooksingle.model.DgIndexMenu;
import com.g1.gzbooksingle.service.IDgIndexMenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 图书分类类目表 服务实现类
 * </p>
 *
 * @author admin
 * @since 2021-10-12
 */
@Service
public class DgIndexMenuServiceImpl extends ServiceImpl<DgIndexMenuMapper, DgIndexMenu> implements IDgIndexMenuService {

    /**
     * 声明一个List来保存从数据库中查询的分类
     */
    private List<DgIndexMenu> indexMenu = new ArrayList<>();

    @Autowired(required = false)
    private DgIndexMenuMapper dgIndexMenuMapper;

    @Override
    public DgIndexMenu selectDgIndexMenuById(Long id) {
//        return null;
        return dgIndexMenuMapper.selectDgIndexMenuById(id);
    }

    @Override
    public List<DgIndexMenu> selectDgIndexMenuList() {
        if (indexMenu.isEmpty()) {
            synchronized (indexMenu) {
                // 防止重复写入
                if (indexMenu.isEmpty()) {
                    // 获取所有分类
                    List<DgIndexMenu> allMenus = dgIndexMenuMapper.selectDgIndexMenuList(new DgIndexMenu());
                    //所有一级分类
                    indexMenu = new ArrayList<>();
                    for (DgIndexMenu indexMenu : allMenus) {
                        // 一级目录的ParentId为0
                        if (indexMenu.getParentId()==0) {
                            this.indexMenu.add(indexMenu);
                        }
                    }
                    for (DgIndexMenu menu : indexMenu) {
                        List<DgIndexMenu> childList = getChild(menu.getId(),allMenus);
                        menu.setChildrenMenu(childList);
                    }
                }
            }
        }
        return indexMenu;
    }

    /**
     * 获取子分类
     * @param id 父分类id
     * @param allMenus 所有分类
     * @return 该父分类的所有子分类
     */
    public List<DgIndexMenu> getChild(Integer id, List<DgIndexMenu> allMenus) {
        List<DgIndexMenu> childList = new ArrayList<>();
        for (DgIndexMenu menu : allMenus) {
            // 遍历所有节点，将所有分类的父id与传过来的父分类的id比较
            //相等说明：为该父分类的子分类。
            if (menu.getParentId().equals(id)) {
                childList.add(menu);
            }
        }
        // 递归
        for (DgIndexMenu menu : childList) {
            menu.setChildrenMenu(getChild(menu.getId(),allMenus));
        }
        //如果节点下没有子节点，返回一个空List（递归退出）
        if (childList.size()==0) {
            return new ArrayList<DgIndexMenu>();
        }
        return childList;
    }
    @Override
    public List<DgIndexMenu> getIndexMenu(){
        if (indexMenu.isEmpty()) {
            return selectDgIndexMenuList();
        }
        return indexMenu;
    }

}
